//////////////////////////////////////////////////////////////////////////
//
// GAM203
// GameObject base class
// GameObject.h
// 
// Scott Taylor
// Qantm College
//
//////////////////////////////////////////////////////////////////////////

#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H

#include <d3dx9math.h>
#include "MeshX.h"
#include "Cube.h"

class Drawable;

class GameObject
{
public:
	GameObject();
	virtual ~GameObject();

	//////////////////////////////////////////////////////////////////////////
	// Update the game object
	//
	// Paramaters:
	// a_dt, the delta time
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	virtual void Update(float a_dt) = 0;

	bool CheckCollision(D3DXVECTOR3 a_min, D3DXVECTOR3 a_max);
	void StartFire();

	virtual void UseAbility(const int a_index) = 0;

	//////////////////////////////////////////////////////////////////////////
	// Description
	//
	// Paramaters:
	// 
	//
	// Returns 
	//
	//////////////////////////////////////////////////////////////////////////
	virtual D3DXVECTOR3 GetCameraAttachPos() const;

	//////////////////////////////////////////////////////////////////////////
	// Description
	//
	// Paramaters:
	// 
	//
	// Returns 
	//
	//////////////////////////////////////////////////////////////////////////
	virtual D3DXVECTOR3 GetCameraTrackPos() const;

	//////////////////////////////////////////////////////////////////////////
	// Set the position of the game object
	//
	// Paramaters:
	// a_pos, the const vector to set the position to
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetPos(const D3DXVECTOR3& a_pos) { m_pos = a_pos; }

	//////////////////////////////////////////////////////////////////////////
	// Get the position of the game object
	//
	// Paramaters:
	// None
	//
	// Returns a const vector of the game objects position
	//
	//////////////////////////////////////////////////////////////////////////
	const D3DXVECTOR3& GetPos() const { return m_pos; }

	//////////////////////////////////////////////////////////////////////////
	// Set the yaw value of the object
	//
	// Paramaters:
	// a_val, the value of the yaw to set
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetYaw(float a_val) { m_yawPitchRoll.x = a_val; }

	//////////////////////////////////////////////////////////////////////////
	// Set the pitch value of the object
	//
	// Paramaters:
	// a_val, the value of the pitch to set
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetPitch(float a_val) { m_yawPitchRoll.y = a_val; }

	//////////////////////////////////////////////////////////////////////////
	// Set the roll value of the object
	//
	// Paramaters:
	// a_val, the value of the roll to set
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetRoll(float a_val) { m_yawPitchRoll.z = a_val; }

	void SetYPR(D3DXVECTOR3 a_ypr);

	//////////////////////////////////////////////////////////////////////////
	// Get the yaw value
	//
	// Paramaters:
	// None
	//
	// Returns the yaw value of the object
	//
	//////////////////////////////////////////////////////////////////////////
	float GetYaw() const { return m_yawPitchRoll.x; }

	//////////////////////////////////////////////////////////////////////////
	// Get the pitch value
	//
	// Paramaters:
	// None
	//
	// Returns the pitch value of the object
	//
	//////////////////////////////////////////////////////////////////////////
	float GetPitch() const { return m_yawPitchRoll.y; }

	//////////////////////////////////////////////////////////////////////////
	// Get the roll value
	//
	// Paramaters:
	// None
	//
	// Returns the roll value of the object
	//
	//////////////////////////////////////////////////////////////////////////
	float GetRoll() const { return m_yawPitchRoll.z; }

	void MoveForward(float a_val, float a_dt);
	void MoveBackward(float a_val, float a_dt);
	void TurnLeft(float a_val, float a_dt);
	void TurnRight(float a_val, float a_dt);
	void StrafeLeft(float a_val, float a_dt);
	void StrafeRight(float a_val, float a_dt);

	char* GetMeshFileName() { return m_pMeshFileName; }

	//////////////////////////////////////////////////////////////////////////
	// Get the drawable pointer of the game object
	//
	// Paramaters:
	// None
	//
	// Returns a drawable pointer to the drawable object
	//
	//////////////////////////////////////////////////////////////////////////
	virtual MeshX* GetMeshX() { return &m_mesh; }
	virtual Cube* GetCollideBox() { return &m_collideBox; }




protected:
	//Semi hacky bounding box
	D3DXVECTOR3 m_minBounds;
	D3DXVECTOR3 m_maxBounds;

	// World position of game object
	D3DXVECTOR3 m_pos;  

	// Uses x,y,z components to store yaw,pitch,roll respectively
	D3DXVECTOR3 m_yawPitchRoll; 

	//Mesh used by the game object
	MeshX m_mesh;

	//Collision box for ray casting
	Cube m_collideBox;

	char* m_pMeshFileName;

};

#endif  // GAMEOBJECT_H

